package converterapp;
import com.sun.glass.events.KeyEvent;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JSpinner;
import javax.swing.text.InternationalFormatter;
/**
*
* @author Azhar, Alex, Jeydan, Russel
*/
public class ConverterView extends javax.swing.JPanel{
/**
* ConverterView mostly contains SWING code (JPanel, JFormattedText, JToggleButton, JButton etc)
* It has main process of converting
*/
private final String[] ISUnits = {"Centimetre","Metre","Kilometre","Celcius"};
private final String[] USUnits = {"Inch","Feet","Yard","Mile","Fahrenheit"};
//private ConverterFormulas cf;
/**
* Creates new form ConverterView
*/
public ConverterView() {
initComponents(); //initialize the component, see Compenent() method for more
txt_sourceUnit.setFormatterFactory(new CostumeFormatter(5)); //set textfield an instance of Formatter class
txt_targetUnit.setFormatterFactory(new CostumeFormatter(5)); //set textfield an instance of Formatter class
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel2 = new javax.swing.JPanel();
lb_title = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
jLabel4 = new javax.swing.JLabel();
cbox_sourceUnit = new javax.swing.JComboBox(ISUnits);
cbox_targetUnit = new javax.swing.JComboBox(USUnits);
btn_convert = new javax.swing.JButton();
toggleBtn_switch = new javax.swing.JToggleButton();
sp_numberAfterDecimal = new javax.swing.JSpinner();
txt_sourceUnit = new javax.swing.JFormattedTextField();
txt_targetUnit = new javax.swing.JFormattedTextField();
setLayout(new java.awt.BorderLayout());
jPanel2.setLayout(new java.awt.BorderLayout());
lb_title.setFont(new java.awt.Font("Arial Narrow", 1, 18)); // NOI18N
lb_title.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lb_title.setText("Converter Application");
jPanel2.add(lb_title, java.awt.BorderLayout.CENTER);
add(jPanel2, java.awt.BorderLayout.PAGE_START);
jPanel1.setLayout(new java.awt.GridBagLayout());
jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
jLabel4.setText("Decimal Places");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(jLabel4, gridBagConstraints);
cbox_sourceUnit.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbox_sourceUnitItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 20;
jPanel1.add(cbox_sourceUnit, gridBagConstraints);
cbox_targetUnit.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cbox_targetUnitItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 20;
jPanel1.add(cbox_targetUnit, gridBagConstraints);
btn_convert.setText("Convert");
btn_convert.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btn_convertActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
jPanel1.add(btn_convert, gridBagConstraints);
toggleBtn_switch.setText("Switch");
toggleBtn_switch.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
toggleBtn_switchItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(toggleBtn_switch, gridBagConstraints);
sp_numberAfterDecimal.setModel(new javax.swing.SpinnerNumberModel(5, 1, 9, 1));
JFormattedTextField tf = ((JSpinner.DefaultEditor) sp_numberAfterDecimal.getEditor()).getTextField();
tf.setEditable(false);
tf.setBackground(Color.white);
sp_numberAfterDecimal.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
sp_numberAfterDecimalStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(sp_numberAfterDecimal, gridBagConstraints);
txt_sourceUnit.setColumns(20);
txt_sourceUnit.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
txt_sourceUnit.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txt_sourceUnitKeyTyped(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(txt_sourceUnit, gridBagConstraints);
txt_targetUnit.setEditable(false);
txt_targetUnit.setFormatterFactory(new CostumeFormatter(5));
txt_targetUnit.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
jPanel1.add(txt_targetUnit, gridBagConstraints);
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void toggleBtn_switchItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_toggleBtn_switchItemStateChanged
// TODO add your handling code here: swap the source units into target units and otherwise
int selectedSourceIndex = cbox_sourceUnit.getSelectedIndex();
int selectedTargetIndex = cbox_targetUnit.getSelectedIndex();
if(evt.getStateChange() == ItemEvent.DESELECTED){
cbox_sourceUnit.setModel(new javax.swing.DefaultComboBoxModel(ISUnits));
cbox_targetUnit.setModel(new javax.swing.DefaultComboBoxModel(USUnits));
} else {
cbox_sourceUnit.setModel(new javax.swing.DefaultComboBoxModel(USUnits));
cbox_targetUnit.setModel(new javax.swing.DefaultComboBoxModel(ISUnits));
}
cbox_sourceUnit.setSelectedIndex(selectedTargetIndex);
cbox_targetUnit.setSelectedIndex(selectedSourceIndex);
}//GEN-LAST:event_toggleBtn_switchItemStateChanged
private void cbox_sourceUnitItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbox_sourceUnitItemStateChanged
// TODO add your handling code here: to avoid choosing invalid units
if(cbox_sourceUnit.getSelectedItem().equals("Celcius")){
if(!cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){
cbox_targetUnit.setSelectedItem("Fahrenheit");
}
} else if(cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){
if(!cbox_targetUnit.getSelectedItem().equals("Celcius")){
cbox_targetUnit.setSelectedItem("Celcius");
}
} else if(cbox_targetUnit.getSelectedItem().equals("Celcius")){
if(!cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){
cbox_targetUnit.setSelectedItem("Metre");
}
} else if(cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){
if(!cbox_sourceUnit.getSelectedItem().equals("Celcius")){
cbox_targetUnit.setSelectedItem("Feet");
}
}
}//GEN-LAST:event_cbox_sourceUnitItemStateChanged
private void cbox_targetUnitItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbox_targetUnitItemStateChanged
// TODO add your handling code here: to avoid choosing invalid units
if(cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){
if(!cbox_sourceUnit.getSelectedItem().equals("Celcius")){
cbox_sourceUnit.setSelectedItem("Celcius");
}
} else if(cbox_targetUnit.getSelectedItem().equals("Celcius")){
if(!cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){
cbox_sourceUnit.setSelectedItem("Fahrenheit");
}
} else if(cbox_sourceUnit.getSelectedItem().equals("Celcius")){
if(!cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){
cbox_sourceUnit.setSelectedItem("Metre");
}
} else if(cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){
if(!cbox_targetUnit.getSelectedItem().equals("Celcius")){
cbox_sourceUnit.setSelectedItem("Feet");
}
}
}//GEN-LAST:event_cbox_targetUnitItemStateChanged
private void sp_numberAfterDecimalStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sp_numberAfterDecimalStateChanged
// TODO add your handling code here: textfield set to zero when place decimal value changes, set new format to field
txt_sourceUnit.setFormatterFactory(new CostumeFormatter(Integer.parseInt(sp_numberAfterDecimal.getValue().toString())));
txt_targetUnit.setFormatterFactory(new CostumeFormatter(Integer.parseInt(sp_numberAfterDecimal.getValue().toString())));
double sourceValue = Double.parseDouble(txt_sourceUnit.getValue().toString());
double targetValue = Double.parseDouble(txt_targetUnit.getValue().toString());
txt_sourceUnit.setValue(sourceValue);
txt_targetUnit.setValue(targetValue);
}//GEN-LAST:event_sp_numberAfterDecimalStateChanged
private void btn_convertActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_convertActionPerformed
// TODO add your handling code here: converting process takes place below this line
String sourceUnit = cbox_sourceUnit.getSelectedItem().toString().toLowerCase(); //get text from selected item from comboxbox with lower case char
String targetUnit = cbox_targetUnit.getSelectedItem().toString().toLowerCase(); //get text from selected item from comboxbox with lower case char
Formulas f = new Formulas(Double.parseDouble(txt_sourceUnit.getValue().toString())); //input the value into object "f"
double value = f.getValue(sourceUnit, targetUnit); //get converted value
txt_targetUnit.setValue(value); //set value to target textfield
}//GEN-LAST:event_btn_convertActionPerformed
private void txt_sourceUnitKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_sourceUnitKeyTyped
// TODO add your handling code here: converting process by pressing enter key
if(evt.getKeyChar() == KeyEvent.VK_ENTER){
String sourceUnit = cbox_sourceUnit.getSelectedItem().toString().toLowerCase();
String targetUnit = cbox_targetUnit.getSelectedItem().toString().toLowerCase();
Formulas f = new Formulas(Double.parseDouble(txt_sourceUnit.getValue().toString()));
double value = f.getValue(sourceUnit, targetUnit);
txt_targetUnit.setValue(value);
}
}//GEN-LAST:event_txt_sourceUnitKeyTyped
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btn_convert;
private javax.swing.JComboBox cbox_sourceUnit;
private javax.swing.JComboBox cbox_targetUnit;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JLabel lb_title;
private javax.swing.JSpinner sp_numberAfterDecimal;
private javax.swing.JToggleButton toggleBtn_switch;
private javax.swing.JFormattedTextField txt_sourceUnit;
private javax.swing.JFormattedTextField txt_targetUnit;
// End of variables declaration//GEN-END:variables
class CostumeFormatter extends JFormattedTextField.AbstractFormatterFactory {
/**
* CostumeFormatter is costume class which extends from AbstractFormatterFactory
* CostumeFormatter sets number format, min & max decimal places, rounding decimal method
*/
private int maximumFractionDigits; // max decimal place stores
CostumeFormatter(int maximumFractionDigits){ //construction with initial max place
this.maximumFractionDigits = maximumFractionDigits;
}
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
// format.setMinimumIntegerDigits(0);
format.setMinimumFractionDigits(1); //set minimum decimal place
format.setMaximumFractionDigits(maximumFractionDigits); //set maximum decimal place
format.setRoundingMode(RoundingMode.HALF_UP); //set rounding decimal method
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
return formatter;
}
}
}